/*
UVG
Algoritmos y Estructuras de Datos 
Hoja de trabajo 7

Integrantes:
Diego Castillo 10098
Julio Castillo 09859
Jose Antonio Muñoz 

Descripci n: Programa principal. 
*/
import java.io.*;
import java.util.Scanner;

class WordTypeCounter {
	public static void main(String[] args) throws Exception
	{
		if(args.length > 1)
		{
			// Declaraci n e inicializaci n de variables.
			File wordFile = new File(args[0]);
			File textFile = new File(args[1]);
			BufferedReader wordreader;
			BufferedReader textreader;
			
			int verbs=0;
			int nouns=0;
			int adjectives=0;
			int adverbs=0;
			int gerunds=0;
                        int opcion;
			
			long starttime;
			long endtime;
			
			// Verificar que los dos par metros que se pasaron sean archivos que existen
			if(wordFile.isFile() && textFile.isFile()) {
				// Leer archivos
				try
				{
					wordreader = new BufferedReader(new FileReader(wordFile));
					textreader = new BufferedReader(new FileReader(textFile));
				}
				catch (Exception ex)
				{
					System.out.println("Error al leer!");
					return;
				}
                                
                        menu();
			//--------------------------------
			opcion = (int)obtenerNumero("Ingrese su opcion: ", false);
                        
                                                 
				// Crear un WordSet para almacenar la lista de palabras
                                if(opcion <0 && opcion>26){
                                    
                                    System.out.print("Dato incorrecto");
                                    opcion = (int)obtenerNumero("Ingrese su opcion: ", false);
                                    
                                }
                                     // =====================================================
                                    WordSet words =  WordSetFactory.generateSimpleSet(opcion);
                                    // =====================================================
  
				String line = null;
				String[] wordParts;
				
				// leer el archivo que contiene las palabras y cargarlo al WordSet.
				starttime = System.currentTimeMillis();
				line = wordreader.readLine();
				while(line!=null)
				{
					wordParts = line.split("\\.");  // lo que esta entre comillas es una expresi n regular.
					if(wordParts.length == 2)
					{
						words.add(new Word(wordParts[0].trim(),wordParts[1].trim()));
					}
					line = wordreader.readLine();
				}
				wordreader.close();
				endtime = System.currentTimeMillis();
				
				System.out.println("Palabras cargadas en " + (endtime-starttime) + " ms.");
				
				// Procesar archivo de texto
				starttime = System.currentTimeMillis();
				line = textreader.readLine();
				String[] textParts;
				Word currentword;
				Word lookupword = new Word();
				
				while(line!=null)
				{
					// Separar todas las palabras en la l nea.
					textParts = line.split("[^\\w-]+"); // utilizar de separador cualquier caracter que no sea una letra, n mero o gui n.
					
					// Revisar cada palabra y verificar de que tipo es. 
					for(int i=0;i<textParts.length;i++)
					{
						lookupword.setWord(textParts[i].trim().toLowerCase());
						currentword = words.get(lookupword);
						if(currentword != null)
						{
							// v-d, v y q son verbos
							if(currentword.getType().equals("v-d") || currentword.getType().equals("v") || currentword.getType().equals("q"))
								verbs++;
							// g son gerundios
							else if(currentword.getType().equals("g") )
								gerunds++;
							// a-s, a-c y a son adjetivos
							else if(currentword.getType().equals("a-s") || currentword.getType().equals("a-c") || currentword.getType().equals("a"))
								adjectives++;
							// e son adverbios
							else if(currentword.getType().equals("e"))
								adverbs++;
							// el resto son sustantivos
							else 
								nouns++;
						}
					}
					
					line = textreader.readLine();
				}
				textreader.close();
				endtime = System.currentTimeMillis();
				System.out.println("Texto analizado en " + (endtime-starttime) + " ms.");
				
				// Presentar estad sticas
				System.out.println("El texto tiene:");
				System.out.println(verbs + " verbos");
				System.out.println(nouns + " sustantivos");
				System.out.println(adjectives + " adjetivos");
				System.out.println(adverbs + " adverbios");
				System.out.println(gerunds + " gerundios");
				
			}
			else
			{
				System.out.println("No encuentro los archivos :'( ");
			}
		}
		else
		{
			System.out.println("Faltan Parametros.");
		}
	}
        
        public static void menu(){
       System.out.println();
       System.out.println("+<<       Seleccione estructura   >>+");
       System.out.println("| 1. ArrayList.                     |");
       System.out.println("| 2. RedBlackTree.                  |");
       System.out.println("| 3. AVLTree Table.                 |");
       System.out.println("| 4. SplayTree.                     |");
       System.out.println("| 5. AATree.                         |");

	}
	
    public static double obtenerNumero(String mensaje, boolean mostrar){
       Scanner ingreso = new Scanner(System.in);
       int num = -1;
       
       System.out.print(mensaje);
       try{
           num = ingreso.nextInt();
       }
       catch(Exception excep){
           if (mostrar)
               System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
       }
       finally{
           ingreso.nextLine();//Atrapar el ENTER
       }
       return num;
    }

}